package com.grape.utils;

import cn.hutool.core.bean.BeanUtil;
import com.beust.jcommander.internal.Lists;
import com.beust.jcommander.internal.Maps;
import com.grape.entity.SysMenu;
import com.grape.vo.MenuVO;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 类描述： 菜单工具类类
 *
 * @author  putao
 * @email   2628279194@qq.com
 */
public abstract class MenuUtils {

    /**
     * 菜单VO转树形
     * @param nodes     菜单VO列表
     * @return          树形后的菜单VO列表
     */
    public static List<MenuVO> getTree(List<MenuVO> nodes) {
        Map<String, MenuVO> nodeMap = Maps.newHashMap();
        List<MenuVO> rootList = Lists.newArrayList();
        for (MenuVO node : nodes) {
            nodeMap.put(node.getId(), node);
            String parentId = node.getParentId();
            if (StringUtils.isBlank(parentId)) {
                rootList.add(node);
            }
        }
        for (MenuVO node : nodes) {
            String parentId = node.getParentId();
            if (StringUtils.isNotBlank(parentId)) {
                continue;
            }
            MenuVO pnode = nodeMap.get(parentId);
            if (pnode == null) {
                continue;
            }
            List<MenuVO> children = pnode.getChildren();
            if (children == null) {
                children = Lists.newArrayList();
                pnode.setChildren(children);
            }
            children.add(node);
        }
        return rootList;
    }

    /**
     * 内部方法-递归获取获取菜单树(核心是设置子菜单集)
     * @param parentId  父级菜单id
     * @param menus     菜单列表
     * @return          树形结构菜单列表
     */
    public static List<SysMenu> recursionSysMenuList(String parentId, List<SysMenu> menus) {
        List<SysMenu> children = new ArrayList<>();
        for (SysMenu menu : menus) {
            // 递归出口-如果当前是子菜单
            if (parentId.equals(menu.getParentId())){
                MenuVO child = new MenuVO();
                BeanUtil.copyProperties(menu, child);
                child.setTitle(child.getName());
                child.setKey(child.getId());
                child.setValue(child.getId());
                child.setChildrenList(recursionSysMenuList(menu.getId(), menus));
                children.add(child);
            }
        }
        return children;
    }

    /**
     * 内部方法-递归获取获取菜单树(核心是设置子菜单集)
     * @param parentId  父级菜单id
     * @param menus     菜单列表
     * @return          树形结构菜单VO列表
     */
    public static List<MenuVO> recursionSysMenu(String parentId, List<SysMenu> menus) {
        List<MenuVO> children = new ArrayList<>();
        for (SysMenu menu : menus) {
            // 递归出口-如果当前是子菜单
            if (parentId.equals(menu.getParentId())){
                MenuVO child = new MenuVO();
                BeanUtil.copyProperties(menu, child);
                child.setTitle(child.getName());
                child.setKey(child.getId());
                child.setValue(child.getId());
                child.setChildren(recursionSysMenu(menu.getId(), menus));
                children.add(child);
            }
        }
        return children;
    }


//    private static List<SysMenu> getMenus(List<SysMenu> menuList){
//        List<SysMenu> parentMenuList = new ArrayList<>();
//        Map<String, SysMenu> idKeyAndMenuValueMap = new HashMap<>();
//
//        for (SysMenu menu : menuList) {
//            if ("0".equals(menu.getParentId())) {
//                parentMenuList.add(menu);
//                idKeyAndMenuValueMap.put(menu.getId(), menu);
//            } else {
//                idKeyAndMenuValueMap.put(menu.getId(), menu);
//            }
//        }
//        for (SysMenu menu : menuList) {
//            if ("0".equals(menu.getParentId())) {
//                continue;
//            }
//            SysMenu parentMenu = idKeyAndMenuValueMap.get(menu.getParentId());
//            parentMenu.getMenuList().add(menu);
//        }
//        return parentMenuList;
//    }
}
